<?php
class subscription extends module {
	function get_hash_code() {
		if ($this->version == 1) return 0;

		$all_params = $this->page_id.$this->block_id.$this->lang_id;

		foreach ($this->view_param as $k => $vp) {
			$all_params .= $k.$vp;
		}

		if (is_array($this->q_param)) {
			foreach($this->q_param as $k => $vp) {
				$all_params .= $k.$vp;
			}
		}

		return md5($all_params);
	}

	function content_init()	{
		global $common_data_server;

		$_MESSAGES_ = array();
		$this->_ENCODING_ = array("0" => "KOI8-R", "1" => "KOI8-R", "2" => "WINDOWS-1251");

		// если подписка, то проверяем наличие e-mail в БД
		if ($this->q_param["action"] == 'subscribe') {
			$tmpl = new vlibTemplate($common_data_server."module_templates/subscription/".$this->view_param["template"]."/subscribe_form.vtmpl");

			// проверка правильности заполнения полей, если все в порядке, то пишем юзера в БД
			if (preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9_-]+(\.[_a-z0-9-]+)+$/i', $this->q_param["email"]) &&
			    $this->q_param["fio"] != '' &&
			    (intval($this->q_param["encoding"]) == 1 || intval($this->q_param["encoding"]) == 2)) {
				$isEmailPresent = sql_select("select ACTIVE, PASSWORD from SUBSCRIBER where EMAIL = '".db_quote($this->q_param["email"])."'");

				// если e-mail отсутствует, то добавляем нового подписчика
				if (count($isEmailPresent) < 1) {
				    	// генерация пароля и добавление юзера в БД
				    	$userPassword = $this->mkpasswd();
					insert_record('SUBSCRIBER', array(
									array('name' => 'FIO', 'value' => $this->q_param["fio"]),
									array('name' => 'EMAIL', 'value' => $this->q_param["email"]),
									array('name' => 'ORGANIZATION', 'value' => $this->q_param["organization"]),
									array('name' => 'ENCODING', 'value' => intval($this->q_param["encoding"])),
									array('name' => 'PASSWORD', 'value' => $userPassword)));

					// если были указаны листы подписки, то добавление связей подписчик <=> лист подписки
					if (is_array($this->q_param["list"]) && count($this->q_param["list"]) > 0) {
						$lastInsertId = sql_select("select max(SUBSCRIBER_ID) from SUBSCRIBER");

						foreach ($this->q_param["list"] as $listId) {
							insert_record('SUBSCRIBER_SUBSCRIBE_LIST', array(
													array('name' => 'SUBSCRIBER_ID', 'value' => $lastInsertId[0][0]),
													array('name' => 'SUBSCRIBE_LIST_ID', 'value' => $listId)));
						}
					}

					// заполнение шаблона письма данными учетной записи подписавшегося
					$email_tmpl = new vlibTemplate($common_data_server."module_templates/subscription/".$this->view_param["template"]."/notification.vtmpl");

					$email_tmpl->setVar("EMAIL", htmlspecialchars($this->q_param["email"], ENT_QUOTES)); #!
					$email_tmpl->setVar("FIO", htmlspecialchars($this->q_param["fio"], ENT_QUOTES)); #!
					$email_tmpl->setVar("ORGANIZATION", htmlspecialchars($this->q_param["organization"], ENT_QUOTES)); #!
					$email_tmpl->setVar("ENCODING", $this->_ENCODING_[intval($this->q_param["encoding"])]);
					if (is_array($this->q_param["list"]) && count($this->q_param["list"]) > 0) {
						$email_tmpl->newLoop("SUBSCRIBE_LIST");
						foreach ($this->q_param["list"] as $listId) {
							$listName = sql_select("select LIST_NAME from SUBSCRIBE_LIST where SUBSCRIBE_LIST_ID = ".intval($listId));
							$email_tmpl->addRow(array("LIST_NAME" => $listName[0][0]));
						}
						$email_tmpl->addLoop("SUBSCRIBE_LIST");
					}
					$email_tmpl->setVar("URL_SUBMIT", "http://".$_SERVER["SERVER_NAME"].
									  $this->go_to_page($this->page_id).
									  "?action".$this->tarea_id."=subscribe_submit".
									  "&email".$this->tarea_id."=".$this->q_param["email"].
									  "&pwd".$this->tarea_id."=".urlencode($userPassword));
					// отправка письма
					$this->send_email(array(
								'FIO' => $this->q_param["fio"],
								'EMAIL' => $this->q_param["email"],
								'ENCODING' => $this->q_param["encoding"]),
								$this->view_param["subscription_notification_subject"],
								$email_tmpl->grab());

					$tmpl->setVar("SUBSCRIBED", 1);
				}
				// если e-mail уже есть в БД
				else {
					// если учетная запись с флагом "активный", то отправка уведомления на e-mail с просьбой подтверждения введенных данных
					if ($isEmailPresent[0][0] == 1) {
						// заполнение шаблона письма данными учетной записи подписавшегося
						$email_tmpl = new vlibTemplate($common_data_server."module_templates/subscription/".$this->view_param["template"]."/changes.vtmpl");

						$email_tmpl->setVar("EMAIL", htmlspecialchars($this->q_param["email"], ENT_QUOTES)); #!
						$email_tmpl->setVar("FIO", htmlspecialchars($this->q_param["fio"], ENT_QUOTES)); #!
						$email_tmpl->setVar("ORGANIZATION", htmlspecialchars($this->q_param["organization"], ENT_QUOTES)); #!
						$email_tmpl->setVar("ENCODING", $this->_ENCODING_[intval($this->q_param["encoding"])]);
						if (is_array($this->q_param["list"]) && count($this->q_param["list"]) > 0) {
							$email_tmpl->newLoop("SUBSCRIBE_LIST");
							foreach ($this->q_param["list"] as $listId) {
								$listName = sql_select("select LIST_NAME from SUBSCRIBE_LIST where SUBSCRIBE_LIST_ID = ".intval($listId));
								$email_tmpl->addRow(array("LIST_NAME" => $listName[0][0]));
							}
							$email_tmpl->addLoop("SUBSCRIBE_LIST");
						}
						$email_tmpl->setVar("URL_SUBMIT", "http://".$_SERVER["SERVER_NAME"].
										  $this->go_to_page($this->page_id).
										  "?action".$this->tarea_id."=changes_submit".
										  "&pwd".$this->tarea_id."=".urlencode($isEmailPresent[0][1]).
										  "&email".$this->tarea_id."=".$this->q_param["email"].
										  "&fio".$this->tarea_id."=".base64_encode($this->q_param["fio"]).
										  ($this->q_param["organization"] != '' ? "&organization".$this->tarea_id."=".base64_encode($this->q_param["organization"]) : '').
										  "&encoding".$this->tarea_id."=".$this->q_param["encoding"].
										  (is_array($this->q_param["list"]) && count($this->q_param["list"]) > 0 ? "&list".$this->tarea_id."[]=".implode("&list".$this->tarea_id."[]=", $this->q_param["list"]) : ""));
						$email_tmpl->setVar("URL_CHANGE", "http://".$_SERVER["SERVER_NAME"].
										  $this->go_to_page($this->page_id).
										  "?action".$this->tarea_id."=subscribe_change".
										  "&pwd".$this->tarea_id."=".urlencode($isEmailPresent[0][1]).
										  "&email".$this->tarea_id."=".$this->q_param["email"]);
						// отправка письма
						$this->send_email(array(
									'FIO' => $this->q_param["fio"],
									'EMAIL' => $this->q_param["email"],
									'ENCODING' => $this->q_param["encoding"]),
									$this->view_param["subscription_changes_subject"],
									$email_tmpl->grab());

						$tmpl->setVar("CHANGED", 1);
					}
					// отлуп, если флаг "активный" сброшен
					else { $tmpl->setVar("CANT_CHANGED", 1); }
				}
			}
			// если были ошибки в заполнении полей, то делаем отлуп
			else {
				if (!preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9_-]+(\.[_a-z0-9-]+)+$/i', $this->q_param["email"]))
					$_MESSAGES_[] = array("MESSAGE" => "Некорректно заполнено поле \"E-mail\".");

				if ($this->q_param["fio"] == '')
					$_MESSAGES_[] = array("MESSAGE" => "Не заполнено поле \"Ф.И.О.\".");

				if (intval($this->q_param["encoding"]) != 1 && intval($this->q_param["encoding"]) != 2)
					$_MESSAGES_[] = array("MESSAGE" => "Указана некорректная кодировка.");

				$tmpl->setLoop("MESSAGES", $_MESSAGES_);
			}
		}
		// если было подтверждение подписки или подтверждение изменения параметров
		elseif ($this->q_param["action"] == "subscribe_submit" || $this->q_param["action"] == "changes_submit") {
			$tmpl = new vlibTemplate($common_data_server."module_templates/subscription/".$this->view_param["template"]."/submit.vtmpl");

			// получение ID подписчик по e-mail и паролю
			$userId = sql_select("select SUBSCRIBER_ID from SUBSCRIBER where EMAIL = ".
						     "'".db_quote($this->q_param["email"])."'".
						     " and PASSWORD = '".db_quote($this->q_param["pwd"])."' and ".
						     ($this->q_param["action"] == "subscribe_submit" ? "(ACTIVE = 0 or ACTIVE is null)" : "ACTIVE = 1"));

			// выставляем флаг "активный", если было подтверждение подписки
			if ($this->q_param["action"] == "subscribe_submit") {
				if (count($userId) > 0) {
					update_record('SUBSCRIBER', array(array('name' => 'ACTIVE', 'value' => 1)), "SUBSCRIBER_ID", $userId[0][0]);
				}
				else { $tmpl->setVar("ERROR", 1); }

				$tmpl->setVar("SUBSCRIBE_SUBMIT", 1);
			}
			// обновляем учетную запись, если было подтверждение изменения параметров
			else {
				// обновляем, если есть ID юзера
				if (count($userId) > 0) {
					update_record('SUBSCRIBER', array(
									array('name' => 'FIO', 'value' => base64_decode($this->q_param["fio"])),
									array('name' => 'EMAIL', 'value' => $this->q_param["email"]),
									array('name' => 'ORGANIZATION', 'value' => base64_decode($this->q_param["organization"])),
									array('name' => 'ENCODING', 'value' => intval($this->q_param["encoding"]))),
									"SUBSCRIBER_ID", $userId[0][0]);

					// выборка листов подписки данного сайта и данной языковой версии
					$listArray = sql_select( "
						select	SUBSCRIBE_LIST.SUBSCRIBE_LIST_ID as ID
						from	SUBSCRIBE_LIST, SUBSCRIBE_LIST_SITE
						where	SUBSCRIBE_LIST.SUBSCRIBE_LIST_ID = SUBSCRIBE_LIST_SITE.SUBSCRIBE_LIST_ID
							and SUBSCRIBE_LIST_SITE.SITE_ID = {$this->site_id}
							and SUBSCRIBE_LIST.LANG_ID = {$this->lang_id}"
						);
					foreach ($listArray as $listId) {
						$lists[] = $listId["ID"];
					}

					// удаление листов подписки текущего пользователя
					if ( count( $listArray ) > 0 ) {
						sql_query( "
							delete
							from	SUBSCRIBER_SUBSCRIBE_LIST
							where	SUBSCRIBER_ID = {$userId[0][0]}
								and SUBSCRIBE_LIST_ID in (".implode( ",", $lists ).")"
							);
					}

					// если были указаны листы подписки, то добавление связей подписчик <=> лист подписки
					if (is_array($this->q_param["list"]) && count($this->q_param["list"]) > 0) {
						foreach ($this->q_param["list"] as $listId) {
							insert_record('SUBSCRIBER_SUBSCRIBE_LIST', array(
													array('name' => 'SUBSCRIBER_ID', 'value' => $userId[0][0]),
													array('name' => 'SUBSCRIBE_LIST_ID', 'value' => $listId)));
						}
					}
				}
				// выдаем ошибку, если ID отсутствует
				else { $tmpl->setVar("ERROR", 1); }

				$tmpl->setVar("CHANGES_SUBMIT", 1);
			}
		}
		// вывод формы подписки
		else {
			$tmpl = new vlibTemplate($common_data_server."module_templates/subscription/".$this->view_param["template"]."/subscribe_form.vtmpl");

			if ($this->q_param["action"] == 'subscribe_change') {
				$subscriber = sql_select("select SUBSCRIBER_ID, FIO, ORGANIZATION, ENCODING from SUBSCRIBER ".
							 "where EMAIL = '".db_quote($this->q_param["email"])."'".
							 " and PASSWORD = '".db_quote($this->q_param["pwd"])."' and ACTIVE = 1");

				if (count($subscriber) > 0) {
					$tmpl->setVar("EMAIL", htmlspecialchars($this->q_param["email"], ENT_QUOTES));
					$tmpl->setVar("FIO", $subscriber[0]["FIO"]);
					$tmpl->setVar("ORGANIZATION", $subscriber[0]["ORGANIZATION"]);
					$tmpl->setVar("ENCODING", $subscriber[0]["ENCODING"]);

					$_lists_ =   sql_select("select SUBSCRIBE_LIST_ID from SUBSCRIBER_SUBSCRIBE_LIST ".
								"where SUBSCRIBER_ID = ".$subscriber[0]["SUBSCRIBER_ID"]);
					foreach ($_lists_ as $row) {
						$subscribed[$row["SUBSCRIBE_LIST_ID"]] = 1;
					}
				}
			}

			$lists = sql_select( "
				select	SUBSCRIBE_LIST.SUBSCRIBE_LIST_ID as ID,
					SUBSCRIBE_LIST.LIST_NAME,
					SUBSCRIBE_LIST.LIST_DESCRIPTION
				from	SUBSCRIBE_LIST, SUBSCRIBE_LIST_SITE
				where	SUBSCRIBE_LIST.SUBSCRIBE_LIST_ID = SUBSCRIBE_LIST_SITE.SUBSCRIBE_LIST_ID
					and SUBSCRIBE_LIST_SITE.SITE_ID = {$this->site_id}
					and SUBSCRIBE_LIST.LANG_ID = {$this->lang_id}
				order by SUBSCRIBE_LIST.LIST_ORDER"
				);

			if (count($lists) > 0) {
				$tmpl->newLoop("SUBSCRIBE_LIST");
				foreach ($lists as $list_info) {
					if ($subscribed[$list_info["ID"]]) $list_info["CHECKED"] = "checked";
					$tmpl->addRow($list_info);
				}
				$tmpl->addLoop("SUBSCRIBE_LIST");
			}

			$tmpl->setVar("FORM_FORMAT", $this->view_param["form_format"]);
		}

		$tmpl->setVar("TAREA_ID", $this->tarea_id);

		$this->body = $tmpl->grab();
	}

	// функция генерации пароля
	function mkpasswd() {
		$reg_password = "";
		$tmp_array = array();
		$up_alpha  = range(65, 90);
		$low_alpha = range(97, 122);
		$number    = range(48, 57);
		$misc      = array("!", "#", "\$", "%", "&", "(", ")",
				   "*", "+", "-", "=", "]", "^", "_");

		srand ((double)microtime()*1000000);

		while (sizeof($tmp_array) < 7) {
			// добавить 0-1 спец. символ
			for ($i = 0; $i < rand(0, 1); $i++) {
				$tmp_array[] = $misc[rand(1, count($misc)) - 1];
			}
			// добавить 1-2 цифры
			for ($i = 0; $i < rand(1, 2); $i++) {
				$tmp_array[] = $number[rand(1, count($number)) - 1];
			}
			// добавить 2-3 заглавных буквы
			for ($i = 0; $i < rand(2, 3); $i++) {
				$tmp_array[] = $up_alpha[rand(1, count($up_alpha)) - 1];
			}
			// добавить 3-5 строчных буквы
			for ($i = 0; $i < rand(3, 5); $i++) {
				$tmp_array[] = $low_alpha[rand(1, count($low_alpha)) - 1];
			}
		}

		shuffle($tmp_array);

		foreach ($tmp_array as $value) {
			$reg_password .= (is_numeric($value) ? Chr($value) : $value);
		}

		return $reg_password;
	}

	// функция отправки письма
	function send_email($recipient, $emailSubject, $emailBody) {
		$email = new vlibMimeMail;

		// шлепаем e-mail получателя
		$email->to($recipient["EMAIL"], "=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'CP1251')."?B?".base64_encode(convert_cyr_string($recipient["FIO"], 'WINDOWS-1251', $this->_ENCODING_[$recipient["ENCODING"]]))."?=");

		// шлепаем e-mail отправителя
		$email->from($this->view_param["subscription_sender_email"], "=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'CP1251')."?B?".base64_encode(convert_cyr_string($this->view_param["subscription_sender_name"], 'WINDOWS-1251', $this->_ENCODING_[$recipient["ENCODING"]]))."?=");

		// шлепаем тему письма
		$email->subject("=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'CP1251')."?B?".base64_encode(convert_cyr_string($emailSubject, 'WINDOWS-1251', $this->_ENCODING_[$recipient["ENCODING"]]))."?=");

		// шлепаем тело письма
		$email->htmlBody(convert_cyr_string($emailBody, 'WINDOWS-1251', $this->_ENCODING_[$recipient["ENCODING"]]), strtolower($this->_ENCODING_[$recipient["ENCODING"]]));

		// отправляем письмо
		$email->send();
	}
}
?>
